package tests;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import services.TerrainService;
import contracts.ContractException;
import contracts.PreconditionException;

public abstract class AbstractTerrainTest {
	private TerrainService terrain;

	protected AbstractTerrainTest(){
		this.terrain = null;
	}

	protected final TerrainService getTerrain(){
		return this.terrain;
	}

	protected final void setTerrain(TerrainService terrain){
		this.terrain = terrain;
	}

	@Before
	public abstract void beforeTests(); 


	@After
	public final void afterTests() {
		this.terrain = null;
	}

	/**
	 * Test de l'objectif 1
	 * precondition de getBloc :  
	 * (1 <= x <= getNombreColonnes(T)) && (1 <= y <= getNombreLignes(T))
	 * cas de test 1.1 : 
	 * (1 <= x <= getNombreColonnes(T)) && (1 <= y <= getNombreLignes(T))
	 */
	@Test
	public void testGetBloc1(){
		try{
			//condition initiale
			this.terrain.init(10,10);
			//operation
			this.terrain.getBloc(8,8);
		}catch(ContractException e){
			e.printStackTrace();
			Assert.fail("Exception levee sur precond de getBloc invalide");
		}
	}

	/**
	 * Test de l'objectif 1
	 * precondition de getBloc :  
	 * (1 <= x <= getNombreColonnes(T)) && (1 <= y <= getNombreLignes(T))
	 * cas de test 1.2 : 
	 * (1 <= x <= getNombreColonnes(T)) && (y > getNombreLignes(T))
	 * @throws ContractException 
	 */
	@Test(expected=PreconditionException.class)
	public void testGetBloc2() throws ContractException{
		//condition initiale
		this.terrain.init(10,10);
		//operation
		this.terrain.getBloc(8,11);

	}

	/**
	 * Test de l'objectif 1
	 * precondition de getBloc :  
	 * (0 <= x < getNombreColonnes(T)) && (0 <= y < getNombreLignes(T))
	 * cas de test 1.3 : 
	 * (0 <= x < getNombreColonnes(T)) && (y < 0)
	 * @throws ContractException 
	 */
	@Test(expected=PreconditionException.class)
	public void testGetBloc3() throws ContractException{
		//condition initiale
		this.terrain.init(10,10);
		//operation
		this.terrain.getBloc(10,-1);
	}


	/**
	 * Test de l'objectif 1
	 * precondition de getBloc :  
	 * (0 <= x < getNombreColonnes(T)) && (0 <= y < getNombreLignes(T))
	 * cas de test 1.4 : 
	 * (x > getNombreColonnes(T)) && (0 <= y < getNombreLignes(T))
	 * @throws ContractException 
	 */
	@Test(expected=PreconditionException.class)
	public void testGetBloc4() throws ContractException{
		//condition initiale
		this.terrain.init(10,10);
		//operation
		this.terrain.getBloc(11,8);
	}

	/**
	 * Test de l'objectif 1
	 * precondition de getBloc :  
	 * (0 <= x < getNombreColonnes(T)) && (0 <= y < getNombreLignes(T))
	 * cas de test 1.5 : 
	 * (x >= getNombreColonnes(T)) && (y >= getNombreLignes(T))
	 * @throws ContractException 
	 */
	@Test(expected=PreconditionException.class)
	public void testGetBloc5() throws ContractException{
		//condition initiale
		this.terrain.init(10,10);
		//operation
		this.terrain.getBloc(11,11);
	}

	/**
	 * Test de l'objectif 1
	 * precondition de getBloc :  
	 * (0 <= x < getNombreColonnes(T)) && (0 <= y < getNombreLignes(T))
	 * cas de test 1.6 : 
	 * (x >= getNombreColonnes(T)) && (y < 0)
	 * @throws ContractException 
	 */
	@Test(expected=PreconditionException.class)
	public void testGetBloc6() throws ContractException{
		//condition initiale
		this.terrain.init(10,10);
		//operation
		this.terrain.getBloc(10,-1);
	}


	/**
	 * Test de l'objectif 1
	 * precondition de getBloc :  
	 * (0 <= x < getNombreColonnes(T)) && (0 <= y < getNombreLignes(T))
	 * cas de test 1.7 : 
	 * (x < 0) && (0 <= y < getNombreLignes(T))
	 * @throws ContractException 
	 */
	@Test(expected=PreconditionException.class)
	public void testGetBloc7() throws ContractException{
		//condition initiale
		this.terrain.init(10,10);
		//operation
		this.terrain.getBloc(-2,8);
	}

	/**
	 * Test de l'objectif 1
	 * precondition de getBloc :  
	 * (0 <= x < getNombreColonnes(T)) && (0 <= y < getNombreLignes(T))
	 * cas de test 1.8 : 
	 * (x < 0) && (y > getNombreLignes(T))
	 * @throws ContractException 
	 */
	@Test(expected=PreconditionException.class)
	public void testGetBloc8() throws ContractException{
		//condition initiale
		this.terrain.init(10,10);
		//operation
		this.terrain.getBloc(-1,11);
	}

	/**
	 * Test de l'objectif 1
	 * precondition de getBloc :  
	 * (0 <= x < getNombreColonnes(T)) && (0 <= y < getNombreLignes(T))
	 * cas de test 1.9 : 
	 * (x <0) && (y < 0)
	 * @throws ContractException 
	 */
	@Test(expected=PreconditionException.class)
	public void testGetBloc9() throws ContractException{
		//condition initiale
		this.terrain.init(10,10);
		//operation
		this.terrain.getBloc(-1,-1);
	}

	/**
	 * Test de l'objectif 2
	 * precondition de init :  (X >= 1) && (Y>= 1)
	 * cas test 2.1 :  (X >= 1) && (Y>= 1)
	 */
	@Test
	public void testInit1(){
		try{
			this.terrain.init(8, 8);
		}catch(ContractException ce){
			ce.printStackTrace();
			Assert.fail("Terrain 2.1 : Envoi d'exception erratique sur precondition de init.");
		}
	}

	/**
	 * Test de l'objectif 2
	 * precondition de init : (X >= 1) && (Y>= 1)
	 * cas test 2.2 :  (X >= 1) && (Y < 1)
	 */
	@Test(expected=PreconditionException.class)
	public void testInit2() throws ContractException{
		//operation
		this.terrain.init(10,0);
	}

	/**
	 * Test de l'objectif 2
	 * precondition de init :  (X >= 1) && (Y >= 1)
	 * cas test 2.3 : (X < 1) && (Y >= 1)
	 */
	@Test(expected=PreconditionException.class)
	public void testInit3() throws ContractException{
		//operation
		this.terrain.init(0,10);
	}

	/**
	 * Test de l'objectif 2
	 * precondition de init : (X >= 1) && (Y>= 1)
	 * cas test 2.4 :  (X < 1) && (Y < 1)
	 */
	@Test(expected=PreconditionException.class)
	public void testInit4() throws ContractException{
		//operation
		this.terrain.init(0,0);
	}

	/**
	 * Test de l'objectif 3
	 * postcondition de init : getNombreColonnes(init(X,Y)) = X
	 * cas de test 3.1 : getNombreColonnes(init(X,Y)) = X
	 */
	@Test
	public void testGetNombreColonnes1(){
		try{
			//condition initiales
			this.terrain.init(8,9);
			//operation
			this.terrain.getNombreColonnes();
		}catch(ContractException ce){
			ce.printStackTrace();
			Assert.fail("Terrain 3.1 : Envoi d'exception erratique sur postcondition de init avec getNombreColonnes().");
		}
	}

	/**
	 * Test de l'objectif 3
	 * postcondition de init : getNombreColonnes(init(X,Y)) = X
	 * cas de test 3.2 : getNombreColonnes(init(X,Y)) != X
	 * NON VERIFIABLE
	 */

	/**
	 * Test de l'objectif 4
	 * postcondition de init : getNombreLignes(init(X,Y)) = Y
	 * cas de test 4.1 : getNombreLignes(init(X,Y)) = Y
	 */
	@Test
	public void testGetNombreLignes1(){
		try{
			//condition initiales
			this.terrain.init(8,9);
			//operation
			this.terrain.getNombreLignes();
		}catch(ContractException ce){
			ce.printStackTrace();
			Assert.fail("Terrain 4.1 : Envoi d'exception erratique sur postcondition de init avec getNombreLignes().");
		}
	}

	/**
	 * Test de l'objectif 4
	 * postcondition de init : getNombreLignes(init(X,Y)) = Y
	 * cas de test 4.2 : getNombreLignes(init(X,Y)) != Y
	 * NON VERIFIABLE
	 */

}
